package com.ccsoft.core;

import com.ccsoft.constant.Constant;
import com.ccsoft.utils.FilesizeUtils;
import com.ccsoft.utils.TimeUtils;
import java.util.concurrent.atomic.LongAdder;

public class DownloaderInfoThread implements Runnable {
    private double fileSize;// 下载文件总大小
    private double prevSize;// 上次下载的大小

    // 下面两个变量都声明为 static 则限定了只能有一个用户下载一个软件
    // 否则下面两个变量的数值不对了
    public static volatile LongAdder downloadSize = new LongAdder();// 本次下载的大小 - downSize

    private long startTime = 0;

    public DownloaderInfoThread(double fileSize) {
        this.fileSize = fileSize;
        startTime = System.currentTimeMillis();
    }

    public void addDownloadSize(double amount){
        this.downloadSize.add((long) amount);
    }

    // 获取任务执行的总时长
    public String getDurationString(){
        long endTime = System.currentTimeMillis();
        long duration = endTime - startTime;

        double speed = this.fileSize / duration * 1000;// 每秒下载字节数 byte/s

        return "总耗时：" + TimeUtils.getTimeString(duration / 1000) + "，平均速度：" + FilesizeUtils.getFilesizeString(speed) + "/s";
    }

    // 返回下载时拆分的信息
    public String getSplitInfo(){
        return "开启" + Constant.THREAD_NUMBER + "个线程下载" + "，每个线程下载" + FilesizeUtils.getFilesizeString(fileSize / Constant.THREAD_NUMBER);
    }

    @Override
    public void run() {
        // 计算下载速度，单位 B - Byte
        // 子线程调用的时间间隔决定了速度的时间单位
        // 如果子线程每秒调用一次，则 speed 表示每秒下载的 字节 - Byte 数量
        int speed = (int) (downloadSize.doubleValue() - prevSize);
        prevSize = downloadSize.doubleValue();

        double remainSize = fileSize - downloadSize.doubleValue();// 计算剩余大小，单位：字节 - Byte
        double remainTime = speed <= 0 ? -1 : remainSize / speed;// 计算剩余时间，如果子线程是每秒调用一次，则本剩余时间的单位是：秒钟

        String downloadInfo = "已下载大小：" + FilesizeUtils.getFilesizeString(downloadSize.longValue()) + " / " + FilesizeUtils.getFilesizeString(fileSize)
                + "，已下载比例：" + String.format("%.1f",downloadSize.longValue() / fileSize * 100) + "%，速度：" + FilesizeUtils.getFilesizeString(speed)
                + "/s，剩余时间：" + TimeUtils.getTimeString((long) remainTime);

        System.out.print("\r");
        System.out.print("\r");// 多换一行，看的清晰
        System.out.print(downloadInfo);
    }
}
